package www.haini.com.test;

import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;

import rx.Observable;
import rx.Subscriber;
import rx.functions.Action1;
import rx.functions.Func1;

/**
 * MainActivity
 *
 * 类的描述: 学习RxJava 以及RxAndroid 例子
 * 创建时间: 2017/11/30  10:57
 * 修改备注:
 */

public class MainActivity extends AppCompatActivity {
    private final String TAG = this.getClass().getName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        testFlatMap();
    }

    /**
     * 例子 demo1:
     */
    private void testMap() {
        Observable.just("images/logo.png") // 输入类型 String
        .map(new Func1<String, Bitmap>() {
            @Override
            public Bitmap call(String filePath) { // 参数类型 String
                return getBitmapFromPath(filePath); // 返回类型 Bitmap
            }
        })
        .subscribe(new Action1<Bitmap>() {
            @Override
            public void call(Bitmap bitmap) {
                showBitmap(bitmap);
            }
        });
    }

    private Bitmap getBitmapFromPath(String path) { return null; }
    private void showBitmap(Bitmap bitmap) {  }

    /**
     * 例子 demo2:
     * 首先假设这么一种需求：假设有一个数据结构『学生』，现在需要打印出一组学生的名字。实现方式很简单：
     */
    private void testFlatMap(){
        Student[] students = {
                new Student("姓名1", new ArrayList<Course>()),
                new Student("姓名2", new ArrayList<Course>()),
                new Student("姓名3", new ArrayList<Course>())
        };
        Subscriber<String> subscriber = new Subscriber<String>() {
            @Override
            public void onCompleted() {
                Log.e(TAG, "加载完成");
            }

            @Override
            public void onError(Throwable e) {
                e.printStackTrace();
            }

            @Override
            public void onNext(String name) {
                Log.e(TAG, "学生的姓名是: " + name);
            }
        };
        Observable.from(students)
                .map(new Func1<Student, String>() {
                    @Override
                    public String call(Student student) {
                        return student.getName();
                    }
                })
                .subscribe(subscriber);
    }

    /**
     * 例子 demo2.2:
     * 那么再假设：如果要打印出每个学生所需要修的所有课程的名称呢？（需求的区别在于，每个学生只有一个名字，但却有多个课程。）
     */
//    private void testFlatMap2(){
//        Student[] students = {
//                new Student("姓名2", new ArrayList<Course>()),
//                new Student("姓名3", new ArrayList<Course>())
//        };
//        Subscriber<Student> subscriber = new Subscriber<Student>() {
//            @Override
//            public void onCompleted() {
//                Log.e(TAG, "加载完成");
//            }
//
//            @Override
//            public void onError(Throwable e) {
//                e.printStackTrace();
//            }
//
//            @Override
//            public void onNext(Student student) {
//                List<Course> courses = student.getCourses();
//                for ( Course course: courses ) {
//                    Log.e(TAG, "课程名称: " + course.getName());
//                }
//            }
//        };
//    }

    // 学生类
    class Student {
        public Student(String name, List<Course> courses) {
            this.name = name;
            this.courses = courses;
        }

        private String name; // 学生名字
        private List<Course> courses; // 课程列表

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public List<Course> getCourses() {
            return courses;
        }

        public void setCourses(List<Course> courses) {
            this.courses = courses;
        }
    }
    // 课程类
    class Course {
        public Course(String name) {
            this.name = name;
        }

        private String name; // 课程名称

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}
